OT: Problem se sestavenim SQL

Otázka od: js-delphi@quick.cz

3. 12. 2003 15:19

Ahoj.
Opet se omlouvam za OT, ale fakt potrebuju poradit.
Mam docela slozity select, ktery mi vraci x sloupcu. V jednom sloupci potrebuju
sloucit xx sloupcu z jedne tabulky. Jde o to, ze ve vysledku chci mit jeden
sloupec, ve kterym bude cela adresa - slozena z:
ulice
mesta
psc
email
tyto jednotlive polozky musi byt mezi sebou oddeleny ","
Vsechny sloupce muzou byt NULL.

Tak a ted problem. At delam co delam, dostanu se do bodu, ze bud na zacatku
nebo na konci tehle slozene adresy dostanu onu ",". Chtel bych se ji zbavit.
Lze nejak primo v selectu nastavit nejakou promennou, se kterou bych potom
pracoval? Lze se z jednoho vysledneho sloupce odkazat na sloupec predchozi?
mam:
select x1,x2,x3,..,
 ''''+Rtrim(ltrim(case a.ulice
  when '' then ''
  else ltrim(a.ulice)+', '
  end +
   case a.mesto
     when '' then ''
     else ltrim(a.mesto)+', '
   end +
     case a.psc
       when '' then ''
       else ltrim(a.psc)+', '
      end
       + isnull(a.email, '')))+'''' as adresa_zadatele,
       x5, ..., xn
from tabulka
left join d_adresa a on (tabulka vazba adresa)

Potrebju, aby mi to vyslo primo z toho selectu a nemuzu vytvaret procedury. F-
ci, ktera mi odtrsani "," mam, ale ta pracuje nekolikrat s tou sectenou adresou
- takze bych to vyresil, kdybych si umel tu sectenou adresu dat do nejake
promenne.

Co vy na tenhle orisek?  
Diky
Jirka
P.S.:Jo! Resim to na MS SQL2000
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1
programator amater


Odpovedá: Lubor Martinsky, SDC

3. 12. 2003 15:30

Sel bych na to ne pres odstranovani tech "," ale pres odstraneni tech NULL
Zkousel jsi rtrim(ltrim(CAST( NULL pole prevod na CHAR() ))) +"," ... atd.?
Nemam tu ted prostredi tak, nemohu vyzkouset.
----- Original Message -----
From: <js-delphi@quick.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, December 03, 2003 2:57 PM
Subject: OT: Problem se sestavenim SQL


> Ahoj.
> Opet se omlouvam za OT, ale fakt potrebuju poradit.
> Mam docela slozity select, ktery mi vraci x sloupcu. V jednom sloupci
potrebuju sloucit xx sloupcu z jedne tabulky. Jde o to, ze ve vysledku chci
mit jeden sloupec, ve kterym bude cela adresa - slozena z:
> ulice
> mesta
> psc
> email
> tyto jednotlive polozky musi byt mezi sebou oddeleny ","
> Vsechny sloupce muzou byt NULL.
>
> Tak a ted problem. At delam co delam, dostanu se do bodu, ze bud na
zacatku nebo na konci tehle slozene adresy dostanu onu ",". Chtel bych se ji
zbavit.
> Lze nejak primo v selectu nastavit nejakou promennou, se kterou bych potom
pracoval? Lze se z jednoho vysledneho sloupce odkazat na sloupec predchozi?
> mam:
> select x1,x2,x3,..,
> ''''+Rtrim(ltrim(case a.ulice
> when '' then ''
> else ltrim(a.ulice)+', '
> end +
> case a.mesto
> when '' then ''
> else ltrim(a.mesto)+', '
> end +
> case a.psc
> when '' then ''
> else ltrim(a.psc)+', '
> end
> + isnull(a.email, '')))+'''' as adresa_zadatele,
> x5, ..., xn
> from tabulka
> left join d_adresa a on (tabulka vazba adresa)
>
> Potrebju, aby mi to vyslo primo z toho selectu a nemuzu vytvaret
procedury. F-ci, ktera mi odtrsani "," mam, ale ta pracuje nekolikrat s tou
sectenou adresou - takze bych to vyresil, kdybych si umel tu sectenou adresu
dat do nejake promenne.
>
> Co vy na tenhle orisek?  
> Diky
> Jirka
> P.S.:Jo! Resim to na MS SQL2000
> --------------------------------------------------
> Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
> D6Prof+SP3; WinXPProf+SP1
> programator amater
>
>
>


Odpovedá: Vlastimil Bardon

3. 12. 2003 16:36

1) Udelal bych na to UDF, s tim se pak lepe pracuje
2) V UDF pak mohu napsat kod v transact SQL a to je snazsi a prehlednejsi,
treba neco takoveho:

SELECT @Result = NULL
if @Adresa1 IS NOT NULL
  SELECT @Result = @Adresa1
if @Adresa2 IS NOT NULL
  SELECT @Result = CASE When @Result Is NULL THEN @Adresa2 ELSE ', '+ @Adresa2
END
if @Adresa3 IS NOT NULL
  SELECT @Result = CASE When @Result Is NULL THEN @Adresa3 ELSE ', '+ @Adresa3
END

no a pak pouziju

select x1, x2, x3, moje_funkce( a.ulice, a.mesto, a.psc, aemail)
from ...

-----Original Message-----
From: js-delphi@quick.cz [mailto:js-delphi@quick.cz]
Sent: Wednesday, December 03, 2003 2:58 PM

select x1,x2,x3,..,
 ''''+Rtrim(ltrim(case a.ulice
  when '' then ''
  else ltrim(a.ulice)+', '
  end +
   case a.mesto
     when '' then ''
     else ltrim(a.mesto)+', '
   end +
     case a.psc
       when '' then ''
       else ltrim(a.psc)+', '
      end
       + isnull(a.email, '')))+'''' as adresa_zadatele,
       x5, ..., xn
from tabulka
left join d_adresa a on (tabulka vazba adresa)

Potrebju, aby mi to vyslo primo z toho selectu a nemuzu vytvaret procedury. F-
ci, ktera mi odtrsani "," mam, ale ta pracuje nekolikrat s tou sectenou adresou
- takze bych to vyresil, kdybych si umel tu sectenou adresu dat do nejake
promenne.


Odpovedá: Lubor Martinsky, SDC

3. 12. 2003 17:08

A takhle ? :

CASE SUBSTRING ( RETEZEC S CARKAMI, STARTPOS=1,ENDPOS=1 )
           WHEN "," THEN RIGHT( RETEZEC S CARKAMI, LEN(RETEZEC S
CARKAMI)-1 )
         ELSE
           .......... a takhle vyndat i tu posledni carku ?  

----- Original Message -----
From: <js-delphi@quick.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, December 03, 2003 3:43 PM
Subject: Re2x: Problem se sestavenim SQL


> Od: "Lubor Martinsky, SDC" <l.martinsky@softdec.cz>
>
> > Sel bych na to ne pres odstranovani tech ","
> > ale pres odstraneni tech NULL
> > Zkousel jsi rtrim(ltrim(CAST( NULL pole
> > prevod na CHAR() ))) +"," ... atd.?
> > Nemam tu ted prostredi tak, nemohu vyzkouset.
>
> Ahoj.
> Odstraneni tech NULL tam prave mam, jenomze... Kdyz vsechny sloupce budou
NULL, tak vysledek bude spravne "". Kdyz ale bude alespon jeden "not NULL" a
zaroven bude email "NULL", dostanu se do vysledku "neco," a to nechci!! Chci
dostat "neco".
> Ruznym kombinovanim dostanu bud, ze mi ta carka bude chybet nebo bude
jedna navic na zacatku nebo na konci. Fakt si myslim, ze to jinak neudelam.
Pomohlo by mi si tu sectenou adresu ulozit do nejake promenne a pak uz to
umim... nebo by mi pomohlo se nejak odkazat v selectu na predchozi sloupec a
zase uz bych se k pozadovanemu vysledku umel dostal... Jenomze to prave
neumim...
> Tak jak dal?
> Diky za napady
> Jirka
> --------------------------------------------------
> Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
> D6Prof+SP3; WinXPProf+SP1
> programator amater
>
>
>


Odpovedá: Lebeda David

4. 12. 2003 6:52

> potrebuju sloucit xx sloupcu z jedne tabulky. Jde o to, ze ve vysledku
> chci mit jeden sloupec, ve kterym bude cela adresa - slozena z: ulice
> mesta psc email tyto jednotlive polozky musi byt mezi sebou oddeleny
> "," Vsechny sloupce muzou byt NULL.

Ahoj,

mne pripada ponekud kostrbate se to snazit resit v selectu. Proc to pospojovani

neresis az v aplikaci? At uz normalni funkci nebo claculated fieldem? Rozhodne
tam
budes mit vice moznosti nez v selectu.

David Lebeda

Odpovedá: Lstiburek Pavel

4. 12. 2003 8:36

A coz takhle pouzit funkci ISNULL ?
Nebylo by to nejjednodusi reseni ?

Pavel

> From: js-delphi@quick.cz [mailto:js-delphi@quick.cz]
> Opet se omlouvam za OT, ale fakt potrebuju poradit.
> Mam docela slozity select, ktery mi vraci x sloupcu. V jednom
> sloupci potrebuju sloucit xx sloupcu z jedne tabulky. Jde o
> to, ze ve vysledku chci mit jeden sloupec, ve kterym bude
> cela adresa - slozena z:
> ulice
> mesta
> psc
> email
> tyto jednotlive polozky musi byt mezi sebou oddeleny ","
> Vsechny sloupce muzou byt NULL.
>
> Tak a ted problem. At delam co delam, dostanu se do bodu, ze
> bud na zacatku nebo na konci tehle slozene adresy dostanu onu
> ",". Chtel bych se ji zbavit.
> Lze nejak primo v selectu nastavit nejakou promennou, se
> kterou bych potom pracoval? Lze se z jednoho vysledneho
> sloupce odkazat na sloupec predchozi?
> mam:
> select x1,x2,x3,..,
> ''''+Rtrim(ltrim(case a.ulice
> when '' then ''
> else ltrim(a.ulice)+', '
> end +
> case a.mesto
> when '' then ''
> else ltrim(a.mesto)+', '
> end +
> case a.psc
> when '' then ''
> else ltrim(a.psc)+', '
> end
> + isnull(a.email, '')))+'''' as adresa_zadatele,
> x5, ..., xn
> from tabulka
> left join d_adresa a on (tabulka vazba adresa)
>
> Potrebju, aby mi to vyslo primo z toho selectu a nemuzu
> vytvaret procedury. F-ci, ktera mi odtrsani "," mam, ale ta
> pracuje nekolikrat s tou sectenou adresou - takze bych to
> vyresil, kdybych si umel tu sectenou adresu dat do nejake promenne.
>
>


Odpovedá: lgcvirag@iol.cz

4. 12. 2003 13:29

Zdravim.

Nejsem sice MSSQL (pracuji s databazi Oracle), ale myslim, ze by to mohlo byt
takto, Ty carky jsem vydelil a dal na ne test ma nasledujici sloupec.

....
case a.ulice
  when '' then ''
   else ltrim(a.ulice)
end
+
case a.mesto
  when '' then ''
  else ','
end
+
case a.mesto
  when '' then ''
  else ltrim(a.mesto)
end
+
case a.psc
  when '' then ''
  else ','
end
+
case a.psc
  when '' then ''
  else ltrim(a.psc)
end
+
case a.email
  when '' then ''
  else ','
end
 + isnull(a.email, '')))+'''' as adresa_zadatele,
       x5, ..., xn
from tabulka
left join d_adresa a on (tabulka vazba adresa)

Ivan Virag


----- Puvodni zprava -----
Predmet: OT: Problem se sestavenim SQL

> select x1,x2,x3,..,
> ''''+Rtrim(ltrim(case a.ulice
> when '' then ''
> else ltrim(a.ulice)+', '
> end +
> case a.mesto
> when '' then ''
> else ltrim(a.mesto)+', '
> end +
> case a.psc
> when '' then ''
> else ltrim(a.psc)+', '
> end
> + isnull(a.email, '')))+'''' as adresa_zadatele,
> x5, ..., xn
> from tabulka
> left join d_adresa a on (tabulka vazba adresa)
>
> Potrebju, aby mi to vyslo primo z toho selectu a nemuzu vytvaret
> procedury. F-ci, ktera mi odtrsani "," mam, ale ta pracuje
> nekolikrat s tou sectenou adresou - takze bych to vyresil, kdybych
> si umel tu sectenou adresu dat do nejake promenne.
>
> Co vy na tenhle orisek?  
> Diky
> Jirka
> P.S.:Jo! Resim to na MS SQL2000
> --------------------------------------------------
> Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
> D6Prof+SP3; WinXPProf+SP1
> programator amater
>
>
>
>